// created by noellynch
// May 15, 2009

package com.sceneworker.editors.glslshadereditor.glslcodepanel;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Enumeration;
import java.util.Hashtable;

import com.sceneworker.util.swing.sourcecompletionpanel.CodeCompletionPart;
import com.sceneworker.util.swing.sourcecompletionpanel.ICodeCompletionKeyWord;

public final class GLSLKeyWordsArray {
	static		private		GLSLKeyWordsArray		mcl_inst;
	
	static	public	GLSLKeyWordsArray	inst() {
		if(mcl_inst == null) {
			mcl_inst = new GLSLKeyWordsArray();
		}
		
		return mcl_inst;
	}
	
	//private	ArrayList<String>		mcla_completion;
	private		ArrayList<ICodeCompletionKeyWord>		mcla_completion;
	
	public	Collection<ICodeCompletionKeyWord>		getGLSLCompletionParts() {
		return mcla_completion;
	}
	
	private	GLSLKeyWordsArray() {
		mcla_completion = new ArrayList<ICodeCompletionKeyWord>();
		
		add("abs", "abs(A)");
		add("acos", "acos(A)");
		add("asin", "asin(A)");
		add("atan", "atan(A)");
		add("ceil", "ceil(A)");
		add("clamp", "clamp(A, B, C)");
		add("cos", "cos(A)");
		add("degrees", "degrees(A)");
		add("discard");
		add("distance", "distance(A, B)");
		add("dot", "dot(A, B)");
		add("exp", "exp(A)");
		add("exp2", "exp2(A)");
		add("floor", "floor(A)");
		add("fract(", "fract(A)");
		add("ftransform", "ftransform()");
		add("inversesqrt", "inversesqrt(A)");
		add("log", "log(A)");
		add("log2", "log2(A)");
		add("max", "max(A, B)");
		add("min", "min(A, B)");
		add("mod", "mod(A, B)");
		add("normalize", "normalize(A)");
		add("pow", "pow(A, B)");
		add("radians", "radians(A)");
		add("sign", "sign(A)");
		add("sin", "sin(A)");
		add("smoothstep", "smoothstep(A, B, C)");
		add("sqrt", "sqrt(A)");
		add("step", "step(A, B)");
		add("tan", "tan(A)");
		add("texture1D", "texture1D(Sampler, float)");
		add("texture2D", "texture2D(Sampler, vec2)");
		add("texture3D", "texture3D(Sampler, vec3)");
		
		add("bool");
		add("float");
		add("int");
		add("vec2");
		add("vec3");
		add("vec4");
		add("mat2");
		add("mat3");
		add("mat4");
		add("ivec2");
		add("ivec3");
		add("ivec4");
		add("bvec2");
		add("bvec3");
		add("bvec4");
		
		add("sampler1D");
		add("sampler2D");
		add("sampler3D");
		add("samplerCube");
		add("sampler1DShadow");
		add("sampler2DShadow");
		
		add("gl_Color");
		add("gl_BackColor");
		add("gl_FragColor");
		add("gl_FrontColor");
		add("gl_LightSource", "gl_LightSource[X]");
		add("gl_ModelViewMatrix");
		add("gl_ModelViewProjectionMatrix");
		add("gl_MultiTexCoord");
		add("gl_Normal");
		add("gl_NormalMatrix");
		add("gl_Position");
		add("gl_ProjectionMatrix");
		add("gl_TexCoord", "gl_TexCoord[X]");
		add("gl_TextureMatrix", "gl_TextureMatrix[X]");
		add("gl_Vertex");
		
		add("attribute");
		add("const");
		add("uniform");
		add("varying");
		
		add(".x", "x", false);
		add(".y", "y", false);
		add(".z", "z", false);
		add(".xyz", "xyz", false);
		add(".r", "r", false);
		add(".g", "g", false);
		add(".b", "b", false);
		add(".a", "a", false);
		add(".rgb", "rgb", false);
		add(".rgba", "rgba", false);
		
		//Collections.sort(mcla_completion);
	}
	
	private	void	add(String str_keyWord, String str_rep, boolean b_isKeyWord) {
		CodeCompletionPart		lcl_part = new CodeCompletionPart(str_keyWord, str_rep, b_isKeyWord);
		mcla_completion.add(lcl_part);
	}
	
	private	void	add(String str_keyWord, String str_rep) {
		CodeCompletionPart		lcl_part = new CodeCompletionPart(str_keyWord, str_rep, true);
		mcla_completion.add(lcl_part);
	}
	
	private	void	add(String str_keyWord) {
		CodeCompletionPart		lcl_part = new CodeCompletionPart(str_keyWord, str_keyWord, true);
		mcla_completion.add(lcl_part);
	}
}
